import router from 'vue-router';
import axios from 'axios';
import QS from 'qs';

import { Toast } from 'vant';

import store from '@/store/index';


// 环境切换/接口地址改变
if (process.env.NODE_ENV === 'development') {
  axios.defaults.baseURL = 'http://kjb_node_wx.ngrok.xiaomiqiu.cn';
} else if (process.env.NODE_ENV === 'test') {
  axios.defaults.baseURL = 'http://test.tinytank.cn';
} else if (process.env.NODE_ENV === 'production') {
  axios.defaults.baseURL = 'http://www.tinytank.cn';
}

// 设置请求超时(单位毫秒)
axios.defaults.timeout = 10000;

// POST请求头设置
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';

// 前端请求拦截(授权页面/表单提交封装)
axios.interceptors.request.use(
  config =>
  // const token = store.state.token;
  // this.headers.authorization = token;
  // token && (config.headers.Authorization === token);
    config
  , error => Promise.error(error),
);

// 响应拦截器(以REST API为例)
axios.interceptors.response.use((response) => {
  if (response.status === 200) {
    return Promise.resolve(response);
  }
  return Promise.reject(response);
}, (error) => {
  if (error.response.status) {
    switch (error.response.status) {
      // 未登录(登陆成功后回到当前路由)
      case 401:
        router.replace({
          path: '/login',
          query: {
            redirect: router.currentRoute.fullPath,
          },
        });
        break;
      // 登陆过期
      case 403:
        Toast({
          message: '登陆过期, 请重新登陆',
          duration: 1000,
          forbidClick: true,
        });
        // 清除 Token
        localStorage.removeItem('token');
        store.commit('loginSuccess', null);
        // 跳转登录页面,并将要浏览的页面 fullPath 传过去,登陆成功后跳转到需要访问的页面
        setTimeout(() => {
          router.replace({
            path: '/login',
            query: {
              redirect: router.currentRoute.fullPath,
            },
          });
        }, 1000);
        break;
      // 请求不存在
      case 404:
        Toast({
          message: '网络资源不存在',
          duration: 1500,
          forbidClick: true,
        });
        break;
      // 其他错误,直接抛出错误提示
      default:
        Toast({
          message: error.response.data.message,
          duration: 1500,
          forbidClick: true,
        });
    }
    return Promise.reject(error.response);
  }
  return Promise.reject(error.response);
});

// HTTP GET方法封装(参数在对象的内层)
export function get(url, params) {
  return new Promise((resolve, reject) => {
    axios.get(url, { params }).then((res) => {
      resolve(res.data);
    }).catch((err) => {
      reject(err.data);
    });
  });
}

// HTTP POST方法封装(使用qs模块进行对象的序列化)
export function post(url, params) {
  return new Promise((resolve, reject) => {
    axios.post(url, QS.stringify(params)).then((res) => {
      resolve(res.data);
    }).catch((err) => {
      reject(err.data);
    });
  });
}

// HTTP DELETE方法封装
export function remove(url, params) {
  return new Promise((resolve, reject) => {
    axios.delete(url, params).then((res) => {
      resolve(res.data);
    }).catch((err) => {
      reject(err.data);
    });
  });
}

// HTTP PUT方法封装
export function update(url, params) {
  return new Promise((resolve, reject) => {
    axios.put(url, params).then((res) => {
      resolve(res.data);
    }).catch((err) => {
      reject(err.data);
    });
  });
}
